{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "8e4b5fda-2a90-42a1-9f15-694996afc249",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "device(type='cuda')"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "from torchvision import transforms, datasets\n",
    "from torch.utils.data import DataLoader\n",
    "import matplotlib.pyplot as plt\n",
    "#隐藏警告\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")               #忽略警告信息\n",
    "plt.rcParams['font.sans-serif']    = ['SimHei'] # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False      # 用来正常显示负号\n",
    "plt.rcParams['figure.dpi']         = 100        #分辨率\n",
    "\n",
    "\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "device"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "88a073ad-8a8d-48a4-aaff-7da6fc14aa7a",
   "metadata": {},
   "source": [
    "### 读取（下载）MNIST数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "3da3dca4-4896-488e-8937-b20a5ebeb8ae",
   "metadata": {},
   "outputs": [],
   "source": [
    "transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])\n",
    "\n",
    "train_dataset = datasets.MNIST(root='../datasets/mnist', train=True, download=True, transform=transform)  # download=True:如果没有下载数据集\n",
    "test_dataset = datasets.MNIST(root='../datasets/mnist', train=False, download=True, transform=transform)  # train=True训练集，=False测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "399f0f60-cf5f-4486-95d9-dc5f30b85694",
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "\n",
    "train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n",
    "test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "464a6a21-9f4e-4752-9a51-77661ec1c6bd",
   "metadata": {},
   "source": [
    "### 展示MNIST数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "1852a06a-0e86-4324-9ba8-a8bf830f5a97",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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176aOXOmyqdOnfLj6FCU559/PtBD8Bt7PUqbL+toIfTY61V279692M9dsWKFynv37vXHkIIKV9YAAAAcRrEGAADgMIo1AAAAh9GzJvnvp3f77ber3K5dO5XtHjVb3vvriYisX7++FKODawJ5L1C778PuSRs4cKDKdq/HbbfdVibjAoqS937MCD+rV69WuXr16oU+Pu8agCkpKWUxpKDClTUAAACHUawBAAA4jGINAADAYWHTs9asWTOV77//fu92//791b7LL7/cp2NfuHBBZXvdLV/ueYbA83g8hea+ffuqPG7cuDIby4MPPqjyH/7wB5VjY2NVXrx4scpDhw4tm4EBgA9q1qypclG/F1955RXvNus/cmUNAADAaRRrAAAADqNYAwAAcFjI9KzZfWaDBg1SOW+PmohIgwYNSnyuLVu2qPzMM8+oHMh1uFB6xphCsz3XZs+erfKf//xnlb///nuVO3TooPKQIUO82wkJCWpfvXr1VD548KDK//znP1XO2+cBBJLd69m0aVOV866jhdCTmpqqckSEb9eGPvnkE38OJ+hxZQ0AAMBhFGsAAAAOo1gDAABwWND0rNWuXVvlFi1aqPzyyy+r3Lx58xKfa9OmTSpPnz5dZft+i6yjFl4iIyNVHj16tMr2/TezsrJUvuqqq4p9LrtvY+3atSo/8cQTxT4WUJ7sXk9fe5YQXOz7Fnft2lVl+/fkuXPnVJ4zZ47K//3vf/03uBDA3x4AAACHUawBAAA4jGINAADAYc70rNWoUUPl119/XWX78/BGjRqV6nx5e4Fmzpyp9tlrV/3www+lOheCy6effqry5s2bVW7Xrl2hz7fXYbP7LW1512F766231L6yvO8oUJ5uuOEGlRcsWBCYgaBMxMXFqVzUPba/+eYblR955BF/DymkcGUNAADAYRRrAAAADqNYAwAAcFi59axdf/31Kk+YMEHl9u3bq3zFFVeU6nynT59W2b5/47Rp07zbOTk5pToXQsuhQ4dU7t+/v8ojR45U+fHHH/fp+LNmzVL51Vdf9W5/+eWXPh0LcJV9b1AAJceVNQAAAIdRrAEAADiMYg0AAMBh5daz1q9fv0JzUT7//HOV33vvPZXPnz+vsr122okTJ3w6H/Czw4cPqzx58uRCMxCOVq1apfIdd9wRoJEgEPbs2aOyfV/jjh07ludwQg5X1gAAABxG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",
      "text/plain": [
       "<Figure size 640x480 with 12 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "for i in range(12):\n",
    "    plt.subplot(3, 4, i+1)\n",
    "    plt.tight_layout()\n",
    "    plt.imshow(train_dataset.data[i], cmap='gray', interpolation='none')\n",
    "    plt.title(\"Labels: {}\".format(train_dataset.train_labels[i]))\n",
    "    plt.xticks([])\n",
    "    plt.yticks([])\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b33e30f-fd1b-4dfa-81fe-724ba3f05e4e",
   "metadata": {},
   "source": [
    "### 构建简单的CNN网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "2ed99698-d5e1-4135-8135-e7d07eec760a",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Net(torch.nn.Module):\n",
    "    def __init__(self):\n",
    "        # （batch,1,28,28）\n",
    "        super(Net, self).__init__()\n",
    "        self.conv1 = torch.nn.Sequential(\n",
    "            torch.nn.Conv2d(1, 32, kernel_size=3), #（batch,32,26,26）\n",
    "            torch.nn.ReLU(),\n",
    "            torch.nn.MaxPool2d(kernel_size=2), #（batch,32,13,13）\n",
    "        )\n",
    "        self.conv2 = torch.nn.Sequential(\n",
    "            torch.nn.Conv2d(32, 64, kernel_size=3), #（batch,64,11,11）\n",
    "            torch.nn.ReLU(),\n",
    "            torch.nn.MaxPool2d(kernel_size=2), #（batch,64,5,5）\n",
    "        )\n",
    "        self.fc = torch.nn.Sequential(\n",
    "            torch.nn.Linear(1600, 50), # 1600 == 64*5*5\n",
    "            # torch.nn.ReLU(),  # 添加ReLU激活函数\n",
    "            torch.nn.Linear(50, 10),\n",
    "        )\n",
    "\n",
    "    def forward(self, x):\n",
    "        batch_size = x.size(0)\n",
    "        x = self.conv1(x)  # 一层卷积层,一层池化层,一层激活层\n",
    "        x = self.conv2(x)  # 再来一次\n",
    "        x = x.view(batch_size, -1)  # flatten 变成全连接网络需要的输入\n",
    "        x = self.fc(x)\n",
    "        return x  # 最后输出的是维度为10的，也就是（对应数学符号的0~9）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "544b231c-4c23-4901-b6ec-907b6ee15154",
   "metadata": {},
   "outputs": [],
   "source": [
    "model = Net().to(device)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2d50bfb5-5df5-48eb-8bd1-5650444ba0a5",
   "metadata": {},
   "source": [
    "### 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e9d593ea-7c20-4c5d-9fa3-aebb490a82cb",
   "metadata": {},
   "outputs": [],
   "source": [
    "loss_fn    = torch.nn.CrossEntropyLoss() # 创建损失函数\n",
    "learn_rate = 1e-2 # 学习率\n",
    "optimizer  = torch.optim.SGD(model.parameters(), lr=learn_rate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "652b2c9e-3b24-4d92-9784-08a4ac309ab5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 训练循环\n",
    "def train(dataloader, model, loss_fn, optimizer):\n",
    "    size = len(dataloader.dataset)  # 训练集的大小，一共60000张图片\n",
    "    num_batches = len(dataloader)   # 批次数目，1875（60000/32）\n",
    "\n",
    "    train_loss, train_acc = 0, 0  # 初始化训练损失和正确率\n",
    "    \n",
    "    for X, y in dataloader:  # 获取图片及其标签\n",
    "        X, y = X.to(device), y.to(device)\n",
    "        \n",
    "        # 计算预测误差\n",
    "        pred = model(X)          # 网络输出\n",
    "        loss = loss_fn(pred, y)  # 计算网络输出和真实值之间的差距，targets为真实值，计算二者差值即为损失\n",
    "        \n",
    "        # 反向传播\n",
    "        optimizer.zero_grad()  # grad属性归零\n",
    "        loss.backward()        # 反向传播\n",
    "        optimizer.step()       # 每一步自动更新\n",
    "        \n",
    "        # 记录acc与loss\n",
    "        train_acc  += (pred.argmax(1) == y).type(torch.float).sum().item()\n",
    "        train_loss += loss.item()\n",
    "            \n",
    "    train_acc  /= size\n",
    "    train_loss /= num_batches\n",
    "\n",
    "    return train_acc, train_loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "ea98c4e4-7374-47bc-9cee-eda0c4dd37d7",
   "metadata": {},
   "outputs": [],
   "source": [
    "def test (dataloader, model, loss_fn):\n",
    "    size        = len(dataloader.dataset)  # 测试集的大小，一共10000张图片\n",
    "    num_batches = len(dataloader)          # 批次数目，313（10000/32=312.5，向上取整）\n",
    "    test_loss, test_acc = 0, 0\n",
    "    \n",
    "    # 当不进行训练时，停止梯度更新，节省计算内存消耗\n",
    "    with torch.no_grad():\n",
    "        for imgs, target in dataloader:\n",
    "            imgs, target = imgs.to(device), target.to(device)\n",
    "            \n",
    "            # 计算loss\n",
    "            target_pred = model(imgs)\n",
    "            loss        = loss_fn(target_pred, target)\n",
    "            \n",
    "            test_loss += loss.item()\n",
    "            test_acc  += (target_pred.argmax(1) == target).type(torch.float).sum().item()\n",
    "\n",
    "    test_acc  /= size\n",
    "    test_loss /= num_batches\n",
    "\n",
    "    return test_acc, test_loss"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a5db3ed0-381d-4866-acc3-331dd671bf74",
   "metadata": {},
   "source": [
    "### 开始训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "1c635d45-0dfb-4d32-952e-5e36c6c74a2c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 1, Train_acc:89.8%, Train_loss:0.348, Test_acc:96.8%，Test_loss:0.110\n",
      "Epoch: 2, Train_acc:96.9%, Train_loss:0.105, Test_acc:97.6%，Test_loss:0.078\n",
      "Epoch: 3, Train_acc:97.7%, Train_loss:0.077, Test_acc:98.0%，Test_loss:0.063\n",
      "Epoch: 4, Train_acc:98.0%, Train_loss:0.063, Test_acc:98.3%，Test_loss:0.052\n",
      "Epoch: 5, Train_acc:98.4%, Train_loss:0.055, Test_acc:98.4%，Test_loss:0.048\n",
      "Epoch: 6, Train_acc:98.5%, Train_loss:0.049, Test_acc:98.7%，Test_loss:0.042\n",
      "Epoch: 7, Train_acc:98.6%, Train_loss:0.045, Test_acc:98.7%，Test_loss:0.043\n",
      "Epoch: 8, Train_acc:98.7%, Train_loss:0.042, Test_acc:98.7%，Test_loss:0.040\n"
     ]
    }
   ],
   "source": [
    "epochs     = 8\n",
    "train_loss = []\n",
    "train_acc  = []\n",
    "test_loss  = []\n",
    "test_acc   = []\n",
    "\n",
    "for epoch in range(epochs):\n",
    "    model.train()\n",
    "    epoch_train_acc, epoch_train_loss = train(train_loader, model, loss_fn, optimizer)\n",
    "\n",
    "    model.eval()\n",
    "    epoch_test_acc, epoch_test_loss = test(test_loader, model, loss_fn)\n",
    "    \n",
    "    train_acc.append(epoch_train_acc)\n",
    "    train_loss.append(epoch_train_loss)\n",
    "    test_acc.append(epoch_test_acc)\n",
    "    test_loss.append(epoch_test_loss)\n",
    "\n",
    "    template = ('Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%，Test_loss:{:.3f}')\n",
    "    print(template.format(epoch+1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "09cb0196-1a1c-41b3-b2d6-167d22c7143a",
   "metadata": {},
   "source": [
    "###  结果可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "1f0a057c-bac1-4f9c-845f-4627d358f5d4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1200x300 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "epochs_range = range(epochs)\n",
    "\n",
    "plt.figure(figsize=(12, 3))\n",
    "plt.subplot(1, 2, 1)\n",
    "\n",
    "plt.plot(epochs_range, train_acc, label='Training Accuracy')\n",
    "plt.plot(epochs_range, test_acc, label='Test Accuracy')\n",
    "plt.legend(loc='lower right')\n",
    "plt.title('Training and Validation Accuracy')\n",
    "\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.plot(epochs_range, train_loss, label='Training Loss')\n",
    "plt.plot(epochs_range, test_loss, label='Test Loss')\n",
    "plt.legend(loc='upper right')\n",
    "plt.title('Training and Validation Loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d4af9f02-3706-449b-8de0-0e5ec0cf2158",
   "metadata": {},
   "source": [
    "### 保存模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bf4e70e3-e32e-4b7b-ad3e-28453f6c7f09",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 指定保存路径\n",
    "save_dir = '../models/1_Handwritten_Digit_Recognition'\n",
    "\n",
    "# 确保目录存在，如果不存在则创建\n",
    "import os\n",
    "if not os.path.exists(save_dir):\n",
    "    os.makedirs(save_dir)\n",
    "\n",
    "# 保存模型\n",
    "torch.save(model.state_dict(), os.path.join(save_dir, 'model_weights.pth'))\n",
    "\n",
    "# # 加载模型参数\n",
    "# model.load(torch.load(os.path.join(save_dir, 'model_weights.pth')))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e90c923b-b39e-4ae8-ad9a-691cbd58b6cf",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.20"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
